/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Dato.Entidad;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import javafx.beans.property.adapter.JavaBeanBooleanProperty;
import javafx.beans.property.adapter.JavaBeanBooleanPropertyBuilder;
import javafx.beans.property.adapter.JavaBeanObjectProperty;
import javafx.beans.property.adapter.JavaBeanObjectPropertyBuilder;
import javafx.beans.property.adapter.JavaBeanProperty;
import javafx.beans.property.adapter.JavaBeanStringProperty;
import javafx.beans.property.adapter.JavaBeanStringPropertyBuilder;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.Transient;

/**
 *
 * @author oscar
 */
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="SERVICIO_TIPO")
public abstract class Servicio implements Serializable {
    private static final long serialVersionUID = 1L;
    
    

    @Id
    private String id;
  
    private String estado="EnAgencia";
    
    private String caracteristica;
    private Float precio;
    private Float descuento;
    private Float recargo;
    private Float total;
    
    private Boolean entregaEnDeposito;
    
    private Boolean envioADomicilio;
    
    private Boolean retiroADomicilio;
    
    private Boolean cobroRevertido;
    

    //Si me dan un sobre lleno de papeles, entonces uso este campo para describir los papeles que contiene el sobre
    private String observaciones;
    
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fechaRecepcion;
    
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date prioridad;
    
    
    @OneToOne
    @JoinColumn(name = "DEUDA_FK")
    private Deuda deuda;
    
    
   
    
   
    
    @ManyToOne
    private Agencia agenciaEmisora;
    
    @ManyToOne
    @JoinColumn(name = "TIPOSERVICIO_FK")
    private TipoServicio tipoDeServicio;
   
    //el campo emisor va a ser heredado por la encmienda y por el tramite, solo queria aclarar que en la encomienda
    //se refiere al cliente que envia la encomienda y en el tramite se refiere al cliente que nos da el tramite para 
    //que se lo tramitemos.
    @ManyToOne
    private Cliente emisor;
    
    

    //seria si es una encomienda es el lugar en donde voy a entregar la encomienda
    //si es tramite es el lugar donde voy a entregar el tramite una vez concluido
    //para mi es asi, destino es el domicilio donde voy a entregar el tramite una vez concluido
    //y en tram definiria una variable de tipo LugarFreTram que sea el lugar de tramite
    @ManyToOne(cascade = CascadeType.ALL)
    private Lugar Destino;
    

     //-------------------propiedades binding
    @Transient
    private JavaBeanBooleanProperty PROP_ENTREGAENDEPOSITO;
    
    @Transient
    private JavaBeanBooleanProperty PROP_ENVIOADOMICILIO;
        
    @Transient
    private JavaBeanBooleanProperty PROP_RETIROADOMICILIO;
    
    @Transient
    private JavaBeanBooleanProperty PROP_COBROREVERTIDO;
    
    @Transient
    private JavaBeanStringProperty PROP_OBSERVACIONES;
    
    @Transient
    private JavaBeanObjectProperty<Date> PROP_FECHARECEPCION;
    
        
    @Transient
    private ArrayList<JavaBeanProperty> GroupBindProperties = new ArrayList<>();

    
    
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCaracteristica() {
        return caracteristica;
    }

    public void setCaracteristica(String caracteristica) {
        this.caracteristica = caracteristica;
    }

    public Float getPrecio() {
        return precio;
    }

    public void setPrecio(Float precio) {
        this.precio = precio;
    }

    public Float getDescuento() {
        return descuento;
    }

    public void setDescuento(Float descuento) {
        this.descuento = descuento;
    }

    public Float getRecargo() {
        return recargo;
    }

    public void setRecargo(Float recargo) {
        this.recargo = recargo;
    }

    public Float getTotal() {
        return total;
    }

    public void setTotal(Float total) {
        this.total = total;
    }
    
    
    

    public Boolean getEntregaEnDeposito() {
        return entregaEnDeposito;
    }

    public void setEntregaEnDeposito(Boolean entregaEnDeposito) {
        this.entregaEnDeposito = entregaEnDeposito;
    }

    public Boolean getEnvioADomicilio() {
        return envioADomicilio;
    }

    public void setEnvioADomicilio(Boolean envioADomicilio) {
        this.envioADomicilio = envioADomicilio;
    }

    public Boolean getRetiroADomicilio() {
        return retiroADomicilio;
    }

    public void setRetiroADomicilio(Boolean retiroADomicilio) {
        this.retiroADomicilio = retiroADomicilio;
    }

    public Boolean getCobroRevertido() {
        return cobroRevertido;
    }

    public void setCobroRevertido(Boolean cobroRevertido) {
        this.cobroRevertido = cobroRevertido;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public Date getFechaRecepcion() {
        return fechaRecepcion;
    }

    public void setFechaRecepcion(Date fechaRecepcion) {
        this.fechaRecepcion = fechaRecepcion;
    }

    public Date getPrioridad() {
        return prioridad;
    }

    public void setPrioridad(Date prioridad) {
        this.prioridad = prioridad;
    }

    public Deuda getDeuda() {
        return deuda;
    }

    public void setDeuda(Deuda deuda) {
        this.deuda = deuda;
    }

    public Cliente getEmisor() {
        return emisor;
    }

    public void setEmisor(Cliente emisor) {
        this.emisor = emisor;
    }

    

    public Agencia getAgenciaEmisora() {
        return agenciaEmisora;
    }

    public void setAgenciaEmisora(Agencia agenciaEmisora) {
        this.agenciaEmisora = agenciaEmisora;
    }

   

   

    public Lugar getDestino() {
        return Destino;
    }

    public void setDestino(Lugar Destino) {
        this.Destino = Destino;
    }

    public JavaBeanBooleanProperty getPROP_ENTREGAENDEPOSITO() throws NoSuchMethodException {
        if (PROP_ENTREGAENDEPOSITO == null) {
            PROP_ENTREGAENDEPOSITO = JavaBeanBooleanPropertyBuilder.create().bean(this).name("entregaEnDeposito").build();
            getGroupBindProperties().add(PROP_ENTREGAENDEPOSITO);
        }
        return PROP_ENTREGAENDEPOSITO;
    }

    public JavaBeanBooleanProperty getPROP_ENVIOADOMICILIO() throws NoSuchMethodException {
        if (PROP_ENVIOADOMICILIO == null) {
            PROP_ENVIOADOMICILIO = JavaBeanBooleanPropertyBuilder.create().bean(this).name("envioADomicilio").build();
            getGroupBindProperties().add(PROP_ENVIOADOMICILIO);
        }
        return PROP_ENVIOADOMICILIO;
    }

    public JavaBeanBooleanProperty getPROP_RETIROADOMICILIO() throws NoSuchMethodException {
        if (PROP_RETIROADOMICILIO == null) {
            PROP_RETIROADOMICILIO = JavaBeanBooleanPropertyBuilder.create().bean(this).name("retiroADomicilio").build();
            getGroupBindProperties().add(PROP_RETIROADOMICILIO);
        }
        return PROP_RETIROADOMICILIO;
    }

    public JavaBeanBooleanProperty getPROP_COBROREVERTIDO() throws NoSuchMethodException {
        if (PROP_COBROREVERTIDO == null) {
            PROP_COBROREVERTIDO = JavaBeanBooleanPropertyBuilder.create().bean(this).name("cobroRevertido").build();
            getGroupBindProperties().add(PROP_COBROREVERTIDO);
        }
        return PROP_COBROREVERTIDO;
    }

    public JavaBeanStringProperty getPROP_OBSERVACIONES() throws NoSuchMethodException {
        
        if (PROP_OBSERVACIONES == null) {
            PROP_OBSERVACIONES = JavaBeanStringPropertyBuilder.create().bean(this).name("observaciones").build();
            getGroupBindProperties().add(PROP_OBSERVACIONES);
        }
        return PROP_OBSERVACIONES;
    }

    public JavaBeanObjectProperty<Date> getPROP_FECHARECEPCION() throws NoSuchMethodException {
        if (PROP_FECHARECEPCION == null) {
            PROP_FECHARECEPCION = JavaBeanObjectPropertyBuilder.create().bean(this).name("fechaRecepcion").build();
            getGroupBindProperties().add(PROP_FECHARECEPCION);
        }
        return PROP_FECHARECEPCION;
    }
    
   
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Servicio)) {
            return false;
        }
        Servicio other = (Servicio) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }


    
    public void unbindingALL() {
        for (JavaBeanProperty beanBinding : GroupBindProperties) {
            beanBinding.unbind();
        }
    }
    
    protected ArrayList<JavaBeanProperty> getGroupBindProperties() {
        return GroupBindProperties;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }
    
    
    
    @Override
    public String toString() {
        return "aplicaciontranserv.Dato.Entidad.Servicio[ id=" + id + " ]";
    }

    public TipoServicio getTipoDeServicio() {
        return tipoDeServicio;
    }

    public void setTipoDeServicio(TipoServicio tipoDeServicio) {
        this.tipoDeServicio = tipoDeServicio;
    }
    
    
    
}
